/*
 * Copyright（C） 2021 Huawei Device Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.agerasample;

import ohos.agp.window.service.DisplayAttributes;
import ohos.agp.window.service.DisplayManager;
import ohos.app.Context;
import ohos.global.configuration.DeviceCapability;

/**
 * 屏幕显示工具类
 *
 * @since 2020-12-18
 */
public class DisplayUtil {
    private static final int BASE_DENSITY = 160;

    /**
     * 获取设备相关属性
     * @param ctx 上下文
     * @return DeviceCapability实例
     */
    public static DeviceCapability getDC(Context ctx) {
        return ctx.getResourceManager().getDeviceCapability();
    }

    /**
     * 获取真实屏幕（不受状态栏影响）的属性集
     *
     * @param ctx 上下文
     * @return 真实屏幕（不受状态栏影响）的属性集DisplayAttributes实例
     */
    public static DisplayAttributes getRealDisplayAttributes(Context ctx) {
        return DisplayManager.getInstance().getDefaultDisplay(ctx).get().getRealAttributes();
    }

    /**
     * 获取屏幕宽度vp
     *
     * @param ctx 上下文
     * @return 屏幕宽度，单位vp
     */
    public static int getScreenWidth(Context ctx) {
        return px2vp(ctx, getScreenPixelWidth(ctx));
    }

    /**
     * 获取屏幕高度vp
     *
     * @param ctx 上下文
     * @return 屏幕高度，单位vp
     */
    public static int getScreenHeight(Context ctx) {
        return px2vp(ctx, getScreenPixelHeight(ctx));
    }

    /**
     * 获取屏幕宽度px
     *
     * @param ctx 上下文
     * @return 屏幕宽度，单位px
     */
    public static int getScreenPixelWidth(Context ctx) {
        return getRealDisplayAttributes(ctx).width;
    }

    /**
     * 屏幕高度px
     *
     * @param ctx 上下文
     * @return 屏幕高度，单位px
     */
    public static int getScreenPixelHeight(Context ctx) {
        return getRealDisplayAttributes(ctx).height;
    }

    /**
     * 将px值转换为vp值
     *
     * @param ctx 上下文
     * @param pxValue px数值
     * @return vp数值
     */
    public static int px2vp(Context ctx, float pxValue) {
        final float scale = ((float) getDC(ctx).screenDensity / BASE_DENSITY);
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将vp值转换为px值
     *
     * @param ctx 上下文
     * @param vpValue vp数值
     * @return px数值
     */
    public static int vp2px(Context ctx, float vpValue) {
        final float scale = ((float) getDC(ctx).screenDensity / BASE_DENSITY);
        return (int) (vpValue * scale + 0.5f);
    }

    /**
     * 将px值转换为fp值
     *
     * @param ctx 上下文
     * @param pxValue px数值
     * @return fp数值
     */
    public static int px2fp(Context ctx, float pxValue) {
        final float fontScale = ((float) getDC(ctx).screenDensity / BASE_DENSITY);
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将fp值转换为px值
     * @param ctx 上下文
     * @param fpValue fp数值
     * @return px数值
     */
    public static int fp2px(Context ctx, float fpValue) {
        final float fontScale = ((float) getDC(ctx).screenDensity / BASE_DENSITY);
        return (int) (fpValue * fontScale + 0.5f);
    }
}
